/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pos.beans;

import entities.Almacen;
import entities.AlmacenTienda;
import entities.Caja;
import entities.LineaTicket;
import entities.ProductoTalla;
import entities.Ticket;
import entities.TicketFormaPago;
import entities.Tienda;
import entities.Usuario;
import entities.UsuarioTienda;
import facades.AlmacenFacade;
import facades.ClienteFacade;
import facades.FormaPagoFacade;
import facades.IvaFacade;
import facades.LineaInventarioAlmacenFacade;
import facades.NivelPrecioPaisFacade;
import facades.ProductoTallaFacade;
import facades.PvpInternacionalFacade;
import facades.TicketFormaPagoFacade;
import facades.TipoTicketFacade;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.enterprise.event.Event;
import javax.enterprise.event.Observes;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import productos.datamodel.FiltroProductos;
import qualifiers.EventoEntidadElegida;
import qualifiers.EventoPreCrearEntidad;
import qualifiers.UsuarioLogeado;

/**
 *
 * @author damfercer
 */
@Named(value = "nuevaDevolucionBean")
@SessionScoped
public class NuevaDevolucionBean extends FiltroProductos implements Serializable{
    @Inject
    TipoTicketFacade tipoTicketFacade;
    @Inject
    IvaFacade ivaFacade;
    @Inject
    AlmacenFacade almacenFacade;
    @Inject
    ClienteFacade clienteFacade;
    @Inject
    @UsuarioLogeado
    Usuario usuario;
    @Inject
    FormaPagoFacade formaPagoFacade;
    @Inject
    ProductoTallaFacade productoTallaFacade;
    @Inject
    PvpInternacionalFacade pvpInternacionalFacade;
    @Inject
    NivelPrecioPaisFacade nivelPrecioPaisFacade;
    @Inject
    LineaInventarioAlmacenFacade lineaInventarioAlmacenFacade;
    @Inject
    TicketFormaPagoFacade ticketFormaPagoFacade;
    private List<Caja> cajasUsuario;
    private Ticket ticket;
    private List<Almacen> almacenesVentasAsociados;
    private TicketFormaPago efectivoTicketFormaPago;
    private TicketFormaPago amexTicketFormaPago;
    private TicketFormaPago visaTicketFormaPago;
    private TicketFormaPago mastercardTicketFormaPago;
    private TicketFormaPago maestroTicketFormaPago;
    private TicketFormaPago transferenciaTicketFormaPago;
    @Inject
    @EventoPreCrearEntidad
    private Event<Ticket> eventoPreCrearTicket;
    private Boolean hayProblemasDeStock;
    /**
     * Creates a new instance of NuevoTicketBean
     */
    public NuevaDevolucionBean() {
        
    }
    
    @PostConstruct
    public void init(){
        this.cajasUsuario=new ArrayList<Caja>();
        for(UsuarioTienda usuarioTienda: usuario.getUsuarioTiendaList()){
            Tienda t=usuarioTienda.getTienda();
            for (Caja caja : t.getCajaList()) {
                cajasUsuario.add(caja);
            }
        }
    }
    public void onDevolverTicket(@Observes @EventoEntidadElegida Ticket t){
        this.ticket=new Ticket();
        ticket.setCliente(t.getCliente());
        ticket.setReserva(t);
        ticket.setLineaTicketList(new ArrayList<LineaTicket>());
        ticket.setTipoTicket(tipoTicketFacade.getTipoTicketDevolucion());
        ticket.setUsuario(null);
        ticket.setCaja(null);
        for (LineaTicket lineaTicket : t.getLineaTicketList()) {
            LineaTicket linea=new LineaTicket();
            linea.setCantidad(0);
            linea.setDescuento(lineaTicket.getDescuento());
            linea.setIva(lineaTicket.getIva());
            linea.setProductoTalla(lineaTicket.getProductoTalla());
            linea.setTotal(lineaTicket.getProductoTalla().getProducto().getPvp());
            linea.setAlmacen(lineaTicket.getAlmacen());
            ticket.getLineaTicketList().add(linea);
        }
    }
   
    /**
     * @return the cajasUsuario
     */
    public List<Caja> getCajasUsuario() {
        return cajasUsuario;
    }

    /**
     * @param cajasUsuario the cajasUsuario to set
     */
    public void setCajasUsuario(List<Caja> cajasUsuario) {
        this.cajasUsuario = cajasUsuario;
    }

    /**
     * @return the ticket
     */
    public Ticket getTicket() {
        return ticket;
    }

    /**
     * @param ticket the ticket to set
     */
    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }
        
    public void onLineaTicketCambiada(LineaTicket lineaTicket){
        Integer maxCantidad=0;
        for(LineaTicket lt: ticket.getReserva().getLineaTicketList()){
            if(lt.getProductoTalla().getIdProductoTalla()==lineaTicket.getProductoTalla().getIdProductoTalla()){
                maxCantidad=lt.getCantidad();
            }
        }
        if(lineaTicket.getCantidad()>maxCantidad){
            FacesContext context = FacesContext.getCurrentInstance();
            Locale locale=context.getViewRoot().getLocale();
            ResourceBundle rb = ResourceBundle.getBundle("messages", locale);
            String errorNoPedidoElegido=rb.getString("ErrorCantidadMayorQueVendida");
            FacesMessage msg =new FacesMessage(errorNoPedidoElegido,errorNoPedidoElegido);
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
            context.renderResponse();
        }
        else if(lineaTicket.getCantidad()>0){
            lineaTicket.setCantidad(lineaTicket.getCantidad()*(-1));
        }
    }    
    
    public LineaTicket recuperarLineaTicketDeProductoTalla(ProductoTalla pt){
        LineaTicket lineaEncontrada=null;
        for(LineaTicket lineaTicket : this.ticket.getLineaTicketList()){
            if(lineaTicket.getProductoTalla().equals(pt)){
                lineaEncontrada=lineaTicket;
                break;
            }
        }
        return lineaEncontrada;
    }
    
    
    public void onCajaElegida(){
        Almacen almacenAsignar=null;
        Tienda tienda=ticket.getCaja().getTienda();
        for (AlmacenTienda almacenTienda : tienda.getAlmacenTiendaList()) {
            if(almacenTienda.getAlmacen().getTipoAlmacen().getIdTipoAlmacen()==1){
                almacenAsignar=almacenTienda.getAlmacen();
                break;
            }
        }
        
        for (LineaTicket lineaTicket : ticket.getLineaTicketList()) {
            if(!almacenEsDeTienda(lineaTicket.getAlmacen(), tienda)){
               lineaTicket.setAlmacen(almacenAsignar);
            }
        }
        almacenesVentasAsociados=new ArrayList<Almacen>();
        for (AlmacenTienda almacenTienda : tienda.getAlmacenTiendaList()) {
            if(almacenTienda.getAlmacen().getTipoAlmacen().getIdTipoAlmacen()==1){
                almacenesVentasAsociados.add(almacenTienda.getAlmacen());
            }
        }
    }
    
    private Boolean almacenEsDeTienda(Almacen a, Tienda t){
        Boolean res=false;
        for(AlmacenTienda at:a.getAlmacenTiendaList()){
            if(at.getTienda().getIdTienda()==t.getIdTienda()){
                res=true;
                break;
            }
        }
        return res;
    }    
    
    public BigDecimal getTotalAPagar(){
        BigDecimal total=BigDecimal.ZERO;
        if(ticket.getLineaTicketList()!=null){
            for (LineaTicket lineaTicket : ticket.getLineaTicketList()) {
                BigDecimal totalLinea=lineaTicket.getTotal().multiply(new BigDecimal(lineaTicket.getCantidad()));
                total=total.add(totalLinea);
            }
        }
        return total;
    }
    
    public void asignarFormasPago(){
        ticket.setTicketFormaPagoList(new ArrayList<TicketFormaPago>());
        efectivoTicketFormaPago=new TicketFormaPago();
        efectivoTicketFormaPago.setCantidad(ticket.getTotal());
        efectivoTicketFormaPago.setFormaPago(formaPagoFacade.getFormaPagoEfectivo());
        if(efectivoTicketFormaPago!=null && efectivoTicketFormaPago.getCantidad()!=null && efectivoTicketFormaPago.getCantidad().compareTo(BigDecimal.ZERO)!=0){
            ticket.getTicketFormaPagoList().add(efectivoTicketFormaPago);
        }
    }
    
    public Map<ProductoTalla,Integer> getMapaDeLineaTicket(List<LineaTicket> lineasTicket){
        Map<ProductoTalla,Integer> mapaLineas=new HashMap<ProductoTalla, Integer>();
        for (LineaTicket lineaTicket : lineasTicket) {
            mapaLineas.put(lineaTicket.getProductoTalla(), lineaTicket.getCantidad());
        }
        return mapaLineas;
    }

    /**
     * @return the almacenesVentasAsociados
     */
    public List<Almacen> getAlmacenesVentasAsociados() {
        return almacenesVentasAsociados;
    }

    /**
     * @param almacenesVentasAsociados the almacenesVentasAsociados to set
     */
    public void setAlmacenesVentasAsociados(List<Almacen> almacenesVentasAsociados) {
        this.almacenesVentasAsociados = almacenesVentasAsociados;
    }

    /**
     * @return the efectivoTicketFormaPago
     */
    public TicketFormaPago getEfectivoTicketFormaPago() {
        return efectivoTicketFormaPago;
    }

    /**
     * @param efectivoTicketFormaPago the efectivoTicketFormaPago to set
     */
    public void setEfectivoTicketFormaPago(TicketFormaPago efectivoTicketFormaPago) {
        this.efectivoTicketFormaPago = efectivoTicketFormaPago;
    }

    /**
     * @return the amexTicketFormaPago
     */
    public TicketFormaPago getAmexTicketFormaPago() {
        return amexTicketFormaPago;
    }

    /**
     * @param amexTicketFormaPago the amexTicketFormaPago to set
     */
    public void setAmexTicketFormaPago(TicketFormaPago amexTicketFormaPago) {
        this.amexTicketFormaPago = amexTicketFormaPago;
    }

    /**
     * @return the visaTicketFormaPago
     */
    public TicketFormaPago getVisaTicketFormaPago() {
        return visaTicketFormaPago;
    }

    /**
     * @param visaTicketFormaPago the visaTicketFormaPago to set
     */
    public void setVisaTicketFormaPago(TicketFormaPago visaTicketFormaPago) {
        this.visaTicketFormaPago = visaTicketFormaPago;
    }

    /**
     * @return the mastercardTicketFormaPago
     */
    public TicketFormaPago getMastercardTicketFormaPago() {
        return mastercardTicketFormaPago;
    }

    /**
     * @param mastercardTicketFormaPago the mastercardTicketFormaPago to set
     */
    public void setMastercardTicketFormaPago(TicketFormaPago mastercardTicketFormaPago) {
        this.mastercardTicketFormaPago = mastercardTicketFormaPago;
    }

    /**
     * @return the maestroTicketFormaPago
     */
    public TicketFormaPago getMaestroTicketFormaPago() {
        return maestroTicketFormaPago;
    }

    /**
     * @param maestroTicketFormaPago the maestroTicketFormaPago to set
     */
    public void setMaestroTicketFormaPago(TicketFormaPago maestroTicketFormaPago) {
        this.maestroTicketFormaPago = maestroTicketFormaPago;
    }

    /**
     * @return the transferenciaTicketFormaPago
     */
    public TicketFormaPago getTransferenciaTicketFormaPago() {
        return transferenciaTicketFormaPago;
    }

    /**
     * @param transferenciaTicketFormaPago the transferenciaTicketFormaPago to set
     */
    public void setTransferenciaTicketFormaPago(TicketFormaPago transferenciaTicketFormaPago) {
        this.transferenciaTicketFormaPago = transferenciaTicketFormaPago;
    }
    public Boolean getPuedeTerminarVenta(){
        return getTicket().getLineaTicketList()!=null && !getTicket().getLineaTicketList().isEmpty();
    }
    
    public void eliminarCeros(){
        for(Iterator<LineaTicket> it = ticket.getLineaTicketList().iterator(); it.hasNext();){
            LineaTicket lineaTicket=it.next();
            if(lineaTicket.getCantidad()==0){
                it.remove();
            }
        }
    }
    
    public String crearTicket(){
        asignarFormasPago();
        eliminarCeros();
        ticket.setUsuario(usuario);
        return confirmarTicket();
    }
    
    public String confirmarTicket(){
        eventoPreCrearTicket.fire(ticket);
        //init();
        return "/views/pos/ListadoTicketsTienda?faces-redirect=true";
    }
    
    
    public void elegirCaja(){
        if(getCajasUsuario().size()==1){
            ticket.setCaja(getCajasUsuario().get(0));
            onCajaElegida();
        }
    }
}


